From 229e1e43545ac296ee06f086bb30cef029ef12c5 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 12 Nov 2014 22:28:30 -0800 Subject: [PATCH] Implement -l/--list for `cargo package` This provides a method of listing the files that will be in a package without actually creating one. Closes #855 --- src/bin/package.rs | 8 ++++++-- src/cargo/ops/cargo_package.rs | 19 ++++++++++++++++--- src/cargo/ops/registry.rs | 2 +- tests/test_cargo_package.rs | 5 +++++ 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/bin/package.rs b/src/bin/package.rs index 108d6b450..ed981e742 100644 --- a/src/bin/package.rs +++ b/src/bin/package.rs @@ -8,6 +8,7 @@ struct Options { flag_verbose: bool, flag_manifest_path: Option, flag_no_verify: bool, + flag_list: bool, } pub const USAGE: &'static str = " @@ -18,8 +19,9 @@ Usage: Options: -h, --help Print this message - --manifest-path PATH Path to the manifest to compile + -l, --list Print files included in a package without making one --no-verify Don't verify the contents by building them + --manifest-path PATH Path to the manifest to compile -v, --verbose Use verbose output "; @@ -27,7 +29,9 @@ Options: pub fn execute(options: Options, shell: &mut MultiShell) -> CliResult> { shell.set_verbose(options.flag_verbose); let root = try!(find_root_manifest_for_cwd(options.flag_manifest_path)); - ops::package(&root, shell, !options.flag_no_verify).map(|_| None).map_err(|err| { + ops::package(&root, shell, + !options.flag_no_verify, + options.flag_list).map(|_| None).map_err(|err| { CliError::from_boxed(err, 101) }) } diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index 807e0166b..9330bad4f 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -25,15 +25,28 @@ impl Drop for Bomb { pub fn package(manifest_path: &Path, shell: &mut MultiShell, - verify: bool) -> CargoResult { + verify: bool, + list: bool) -> CargoResult> { let mut src = try!(PathSource::for_path(&manifest_path.dir_path())); try!(src.update()); let pkg = try!(src.get_root_package()); + if list { + let root = pkg.get_manifest_path().dir_path(); + let mut list: Vec<_> = try!(src.list_files(&pkg)).iter().map(|file| { + file.path_relative_from(&root).unwrap() + }).collect(); + list.sort(); + for file in list.iter() { + println!("{}", file.display()); + } + return Ok(None) + } + let filename = format!("package/{}-{}.crate", pkg.get_name(), pkg.get_version()); let dst = pkg.get_absolute_target_dir().join(filename); - if dst.exists() { return Ok(dst) } + if dst.exists() { return Ok(Some(dst)) } let mut bomb = Bomb { path: Some(dst.clone()) }; @@ -46,7 +59,7 @@ pub fn package(manifest_path: &Path, human("failed to verify package tarball") })) } - Ok(bomb.path.take().unwrap()) + Ok(Some(bomb.path.take().unwrap())) } fn tar(pkg: &Package, src: &PathSource, shell: &mut MultiShell, diff --git a/src/cargo/ops/registry.rs b/src/cargo/ops/registry.rs index f5e994457..723c7f1f5 100644 --- a/src/cargo/ops/registry.rs +++ b/src/cargo/ops/registry.rs @@ -33,7 +33,7 @@ pub fn publish(manifest_path: &Path, try!(verify_dependencies(&pkg, ®_id)); // Prepare a tarball - let tarball = try!(ops::package(manifest_path, shell, verify)); + let tarball = try!(ops::package(manifest_path, shell, verify, false)).unwrap(); // Upload said tarball to the specified destination try!(shell.status("Uploading", pkg.get_package_id().to_string())); diff --git a/tests/test_cargo_package.rs b/tests/test_cargo_package.rs index d1a9da43d..c4a07ba27 100644 --- a/tests/test_cargo_package.rs +++ b/tests/test_cargo_package.rs @@ -35,6 +35,11 @@ test!(simple { compiling = COMPILING, dir = p.url()).as_slice())); assert_that(&p.root().join("target/package/foo-0.0.1.crate"), existing_file()); + assert_that(p.process(cargo_dir().join("cargo")).arg("package").arg("-l"), + execs().with_status(0).with_stdout("\ +Cargo.toml +src[..]main.rs +")); assert_that(p.process(cargo_dir().join("cargo")).arg("package"), execs().with_status(0).with_stdout("")); -- 2.30.2